from app import db

class ResultInterfaceSum(db.Model):
    __tablename__="result_interface_sum"
    id=db.Column(db.Integer, primary_key=True, autoincrement=True)
    test_datetime=db.Column(db.DateTime)
    total_num=db.Column(db.Integer)
    success_num=db.Column(db.Integer)
    remark=db.Column(db.String(512))

    def __init__(self, test_datetime, total_num, success_num, remark):
        self.test_datetime=test_datetime
        self.total_num=total_num
        self.success_num=success_num
        self.remark=remark

    def __repr__(self):
        return f"{self.test_datetime}"

class ResultInterfaceDetail(db.Model):
    __tablename__="result_interface_detail"
    id=db.Column(db.Integer, primary_key=True, autoincrement=True)
    result_sum_id=db.Column(db.Integer, db.ForeignKey("result_interface_sum.id"), comment="通过result_interface_sum.id字段值关联2张表")
    case_number=db.Column(db.String(128), unique=True, nullable=False, comment="测试用例编号，唯一标识，形如XG_XXX_0001")
    case_level=db.Column(db.Integer, nullable=False, comment="测试用例等级，0-BVT测试 致命测试用例，1-A级测试 正确性验证，重要、主干流程，2-B级测试 错误、边界值验证，3-C级测试 其他")
    case_depth=db.Column(db.Integer, nullable=False, comment="测试用例深度，0-return_code验证，1-结构完整性验证，2-参数完整性验证，3-特殊参数值验证")
    interface_name=db.Column(db.String(128), comment="接口名称")
    request_method=db.Column(db.String(10), comment="请求方法，post，get，delete，put等")
    request_url=db.Column(db.String(128), comment="请求地址，注：对get请求，url可能已包含请求参数，也可能不包含，因此代码需全面考虑各种情况")
    request_header=db.Column(db.String(256), comment="请求头，注：兴观系统有默认请求头")
    request_params=db.Column(db.String(512), comment="请求参数")
    response_content=db.Column(db.Text, comment="响应正文，即response.content")
    return_code_to_compare=db.Column(db.String(16), comment="待比较的关键参数名称，如errno")
    actual_return_code=db.Column(db.String(16), comment="实际关键参数值")
    expect_return_code=db.Column(db.String(16), comment="预期关键参数值")
    return_code_compare_result=db.Column(db.Integer, comment="关键参数值比较结果，0-fail，1-pass，2-无待比较值，3-比较出错，4-返回值不合法，5-系统异常")
    json_schema=db.Column(db.Text, comment="结构完整性json schema")
    structure_complete_compare_result=db.Column(db.Integer, comment="结构完整性比较结果")
    actual_params=db.Column(db.String(256), comment="实际响应正文中的参数集合")
    expect_params=db.Column(db.String(256), comment="预期响应正文中的参数集合")
    param_complete_compare_result=db.Column(db.Integer, comment="参数完整性比较结果，0-fail，1-pass，2-获取参数级错误，3-系统异常")
    param_to_compare=db.Column(db.String(16), comment="待比较的特殊参数名称")
    actual_param_value=db.Column(db.String(16), comment="实际特殊参数值")
    expect_param_value=db.Column(db.String(16), comment="预期特殊参数值")
    json_path=db.Column(db.String(256), comment="获取实际参数值的json path路径")
    param_value_compare_result=db.Column(db.Integer, comment="特殊参数值比较结果，0-fail，1-pass")
    duration=db.Column(db.Float, comment="请求时长")
    """ 原数据库设计包含如下2个字段，查看用例创建时间和更新时间，但目前设计思想是保存历史测试结果，因此不需要记录时间，只需记录测试时间即可 """
    # create_time=db.Column(db.DateTime)
    # update_time=db.Column(db.DateTime)

    def __init__(self, result_sum_id, case_number, case_level, case_depth, interface_name, request_method, request_url, request_header, request_params, response_content, return_code_to_compare, actual_return_code, expect_return_code,
                 return_code_compare_result, json_schema, structure_complete_compare_result, actual_params, expect_params, param_complete_compare_result, param_to_compare,
                 actual_param_value, expect_param_value, json_path, param_value_compare_result, duration):
        self.result_sum_id=result_sum_id
        self.case_number=case_number
        self.case_level=case_level
        self.case_depth=case_depth
        self.interface_name=interface_name
        self.request_method=request_method
        self.request_url=request_url
        self.request_header=request_header
        self.request_params=request_params
        self.response_content=response_content
        self.return_code_to_compare=return_code_to_compare
        self.actual_return_code=actual_return_code
        self.expect_return_code=expect_return_code
        self.return_code_compare_result=return_code_compare_result
        self.json_schema=json_schema
        self.structure_complete_compare_result=structure_complete_compare_result
        self.actual_params=actual_params
        self.expect_params=expect_params
        self.param_complete_compare_result=param_complete_compare_result
        self.param_to_compare=param_to_compare
        self.actual_param_value=actual_param_value
        self.expect_param_value=expect_param_value
        self.json_path=json_path
        self.param_value_compare_result=param_value_compare_result
        self.duration=duration

    def __repr__(self):
        return f"{self.case_number}"

class ResultVideoSum(db.Model):
    __tablename__="result_video_sum"
    id=db.Column(db.Integer, primary_key=True, autoincrement=True)
    test_datetime=db.Column(db.DateTime)
    total_num=db.Column(db.Integer)
    success_num=db.Column(db.Integer)
    detail_url=db.Column(db.String(512))
    remark=db.Column(db.String(100))
    result_detail=db.relationship("ResultVideoDetail", backref="result_video_sum", lazy="dynamic")

    def __init__(self, test_datetime, total_num, success_num, detail_url, remark):
        self.test_datetime=test_datetime
        self.total_num=total_num
        self.success_num=success_num
        self.detail_url=detail_url
        self.remark = remark

    def __repr__(self):
        return f"{self.test_datetime}"


class ResultVideoDetail(db.Model):
    __tablename__="result_video_detail"
    id=db.Column(db.Integer, primary_key=True, autoincrement=True)
    result_sum_id=db.Column(db.Integer, db.ForeignKey("result_video_sum.id"))
    event_type_id=db.Column(db.Integer, db.ForeignKey("config_event_type.id"))
    test_video_url=db.Column(db.String(512))
    event_video_url=db.Column(db.String(512))
    event_image_url=db.Column(db.String(512))
    expect_result = db.Column(db.Integer)
    actual_result = db.Column(db.Integer)
    test_result = db.Column(db.Integer)

    def __init__(self, result_sum_id, event_type_id, test_video_url, event_video_url, event_image_url, expect_result, actual_result, test_result):
        self.result_sum_id=result_sum_id
        self.event_type_id=event_type_id
        self.test_video_url=test_video_url
        self.event_video_url=event_video_url
        self.event_image_url=event_image_url
        self.expect_result=expect_result
        self.actual_result=actual_result
        self.test_result=test_result

    def __repr__(self):
        return f"{self.test_video_url}"

class ConfigEventType(db.Model):
    __tablename__="config_event_type"
    id=db.Column(db.Integer, primary_key=True, autoincrement=True)
    name=db.Column(db.String(100))
    interface_type=db.Column(db.String(10))
    param_set=db.Column(db.String(2000))
    line_type=db.Column(db.Integer)
    is_enabled=db.Column(db.Boolean)
    is_show=db.Column(db.Boolean)
    alarm_name=db.Column(db.String(100))
    event_show_id=db.Column(db.String(100))
    remark=db.Column(db.String(1000))
    result_detail=db.relationship("ResultVideoDetail", backref="config_event_type", lazy="dynamic")

    def __init__(self, name, interface_type, param_set, line_type, is_enabled, is_show, alarm_name, event_show_id, remark):
        self.name=name
        self.interface_type=interface_type
        self.param_set=param_set
        self.line_type=line_type
        self.is_enabled=is_enabled
        self.is_show=is_show
        self.alarm_name=alarm_name
        self.event_show_id=event_show_id
        self.remark=remark

    def __repr__(self):
        return f"{self.name}"


